/**
 * @description: throttle
 * 1、高阶函数，传入一个函数，返回一个函数。
 * 2、在持续时间 n 的操作下，每间隔时间 delay ，就执行一次回调, n > delay。n < delay 时，delay 时间后也会执行一次回调。
 * 3、回调函数执行需要绑定 this 和传参。
 * @author: huen2015
 */

import { IFn } from './types'

function throttle(
	fn: IFn,
	delay = 300,
): EventListenerOrEventListenerObject | any {
	let timer: any = null

	return function (this: any, ...args: any[]) {
		if (timer) return

		timer = setTimeout(() => {
			fn.apply(this, args)
			clearTimeout(timer)
			timer = null
		}, delay)
	}
}

const throttleDom = document.querySelector('#throttle')
if (throttleDom) {
	// Event - UIEvent - MouseEvent - PointerEvent
	throttleDom.addEventListener(
		'click',
		throttle(function (this: any, e: PointerEvent) {
			console.log('throttle - 节流')
			console.log('this', this)
			console.log('e', e)
		}),
	)
}

export { throttle }
